package com.sixth.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sixth.core.annotation.OperaLog;
import com.sixth.core.entity.Role;
import com.sixth.core.entity.RoleUserEntity;
import com.sixth.core.vo.R;
import com.sixth.system.service.RoleService;
import com.sixth.system.vo.RoleVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理控制器
 *
 * @author Stu YH
 * @date Created in 2024/8/16 14:34
 * @description 提供角色相关的API接口
 * @modified By：
 * @version:
 */
@Api(tags = "角色管理")
@RestController
@RequestMapping("system/role")
public class RoleController {
    @Autowired
    private RoleService roleService;

    /**
     * 查询所有可用角色
     * @return 角色列表
     */
    @ApiOperation(value = "查询所有可用角色", notes = "查询系统中的所有可用角色")
    @RequestMapping("selectAllRole")
    public R<List<Role>> selectAllRole() {
        return roleService.selectAllRole();
    }

    /**
     * 分页查询角色
     * @param roleVo 查询条件
     * @return 角色列表分页信息
     */
    @ApiOperation(value = "分页查询角色", notes = "根据查询条件分页查询角色列表")
    @PostMapping("/listByPage")
    public R<Page<Role>> list(@RequestBody RoleVo roleVo) {
        return roleService.selectByPage(roleVo);
    }

    /**
     * 根据roleId查找角色
     * @param roleId 角色ID
     * @return 角色信息
     */
    @ApiOperation(value = "根据roleId查找角色", notes = "根据角色ID查询角色详细信息")
    @RequestMapping("/getByRoleId/{roleId}")
    public R<Role> getById(@PathVariable Long roleId) {
        return roleService.getById(roleId);
    }

    /**
     * 添加或修改角色
     * @param role 角色对象
     * @return 操作结果
     */
    @ApiOperation(value = "添加或修改角色", notes = "根据角色对象添加或修改角色")
    @PostMapping("/add_update_role")
    public boolean addUpdate(@RequestBody Role role) {
        return roleService.add_update_role(role);
    }

    /**
     * 批量删除角色
     * @param roleIds 角色ID数组
     * @return 删除结果
     */
    @OperaLog(value = "删除角色", type = 3)
    @ApiOperation(value = "批量删除角色", notes = "根据角色ID数组批量删除角色")
    @GetMapping("/batchDelete")
    public R batchDelete_role(Long[] roleIds) {
        return roleService.batchDelete_role(roleIds);
    }

    /**
     * 删除角色
     * @param roleId 角色ID
     * @return 删除结果
     */
    @OperaLog(value = "删除角色", type = 3)
    @ApiOperation(value = "删除角色", notes = "根据角色ID删除角色")
    @GetMapping("/delete/{roleId}")
    public R removeById(@PathVariable Long roleId) {
        return roleService.removeById(roleId);
    }

    /**
     * 根据用户ID查询用户拥有的角色IDS
     * @param userId 用户ID
     * @return 角色ID列表
     */
    @ApiOperation(value = "根据用户ID查询用户拥有的角色IDS", notes = "根据用户ID查询该用户拥有的角色ID列表")
    @GetMapping("/findRolesByUserId/{userId}")
    public R<List<Long>> findRolesByUserId(@PathVariable Long userId) {
        return roleService.findRolesByUserId(userId);
    }

    /**
     * 保存角色和用户之间的关系
     * @param currentUserId 当前用户ID
     * @param roleIds 角色ID数组
     * @return 保存结果
     */

    @ApiOperation(value = "保存角色和用户之间的关系", notes = "保存指定用户和多个角色之间的关系")
    @OperaLog(value = "保存角色和用户之间的关系", type = 4)
    @PostMapping("/saveRoleUser/{currentUserId}/{roleIds}")
    public R saveRoleUser(@PathVariable Long currentUserId, @PathVariable Long[] roleIds) {
        return roleService.saveRoleUser(currentUserId, roleIds);
    }
}
